/*
The MIT License (MIT)

Copyright (c) 2013 Mike Dapiran, Brian May, Richard Pospesel, and Bert Wierenga

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software 
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#pragma once

//#include <vld.h>

namespace Hogshead
{
	namespace Core
	{
		/**
		* Interfaces used in the Hogshead Engine
		*/

		// IHObject classes can be stored in the Factory
		class IHObject;
		// IMessages are sent using the Messenger class.  Recieving objects call their onMessage() methods when receiving IMessages
		class IMessage;
		class IMessageReceiver;
		class IMessageSender;
		// IComponents are added to GameObjects and add all our functionality
		class IComponent;

		class IGUIObject;

		// An IResource is some kind of shared data like textures, audio clips, etc.  Each will have a load() method.
		class IContent;

		class GameObject;
		class GUIPanel;

		class Scene;
		// IDirector Directors are added to Games and typically have IComponents registered with them
		class IDirector;
		
		// An IRenderInfo is used for rendering
		class IRenderInfo;
		// 
		class IContent;

		class IGame;

		/**
		* Managers
		*/

		// Handles memory allocation of IPreallocated objects.
		class Factory;
		// Objects send forward IMessages through the Messenger class.
		class Messenger;
		//class Messenger;
		// ComponentIndex maintains an index of IComponents types so that we can parse XML files
		class ComponentIndex;
		// DirectorIndex maintains an index of IDirector types so that we can parse XML files
		class DirectorIndex;
		// ResourceLibrary maintains an index of IResource types so we can load various types of Resources; also stores loaded Resources for future lookup
		class ResourceLibrary;

		/**
		* Messages
		*/
		
		// This message is sent by Scene::pause()
		class ScenePausedMessage;
		// This message is sent by Scene::resume()
		class SceneResumedMessage;

		class AddGameObjectMessage;
		class MoveGameObjectMessage;
		class RemoveGameObjectMessage;

		class PanelTransformMessage;
		class ChangeButtonStateMessage;

		class SetActivationMessage;

		class SetTransformMessage;

		/**
		* RenderInfos
		*/

		class SphereWireframe;
		class CylinderWireframe;
		class CapsuleWireframe;
		class TriangleWireframe;
		class LineList;
		/**
		* Other Stuff
		*/
		class Scene;
		class GameObject;
		class Transform;
		class ParameterField;

		class Prefab;
	}
}

#include "Interfaces\IHObject.h"
#include "Interfaces\IMessage.h"
#include "Interfaces\IComponent.h"
#include "Interfaces\IDirector.h"

#include "DataStructures\ParameterField.h"



#include "Transform.h"
#include "GameObject.h"

#include "GUIPanel.h"

#include "Interfaces\IGame.h"
#include "Interfaces\IContent.h"
#include "Interfaces\IComponent.h"
#include "Interfaces\IGUIObject.h"
#include "Interfaces\IMessage.h"
#include "Interfaces\IDirector.h"
#include "Interfaces\IMessageReceiver.h"
#include "Interfaces\IMessageSender.h"

#include "Content\Prefab.h"
#include "Content\Scene.h"

#include "Managers\Factory.h"
#include "Managers\ComponentIndex.h"
#include "Managers\DirectorIndex.h"
#include "Managers\Messenger.h"
#include "Managers\ContentLibrary.h"

#include "Messages\ScenePausedMessage.h"
#include "Messages\SceneResumedMessage.h"
#include "Messages\AddGameObjectMessage.h"
#include "Messages\MoveGameObjectMessage.h"
#include "Messages\RemoveGameObjectMessage.h"
#include "Messages\PanelTransformMessage.h"
#include "Messages\ChangeButtonStateMessage.h"
#include "Messages\SetActivationMessage.h"
#include "Messages\SetTransformMessage.h"

using namespace Hogshead::Core;

